package tests;
import modelo.*;
import junit.framework.TestCase;
import utilitarios.*;

public class PruebasProyectil extends TestCase {

	protected Escenario escenario;
	
	@Override
    public void setUp() {
		escenario = new Escenario(100, 100);		
	}
	
	public void testSiDosProyectilesChocanSeDestruyenAmbos() {
		
		// ARRANGE
		Proyectil bala1 = new Proyectil(escenario, new PuntoXY(15, 15));
		Proyectil bala2 = new Proyectil(escenario, new PuntoXY(50, 15));
		escenario.agregarObjeto(bala1);
		escenario.agregarObjeto(bala2);
		
		// ACT
		bala1.seMovera(new DireccionDerecha());
		bala2.seMovera(new DireccionIzquierda());
		for (int i = 1; i < 100; i++) {
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(false, escenario.contieneA(bala1));
		assertEquals(false, escenario.contieneA(bala2));
	}
	
	public void testProyectilConVelocidadMediaVaMasRapidoQueProyectilConVelocidadMinima () {
		
		// ARRANGE		
		Ametralladora amet = new Ametralladora(escenario, new PuntoXY(15.0, 15.0));
		Canion canion = new Canion(escenario, new PuntoXY(15.0, 45.0));
		
		Proyectil balaAmet = amet.descargar();			// Velocidad minima (1)
		Proyectil balaCanion = canion.descargar();		// Velocidad media (2)

		escenario.agregarObjeto(balaAmet);
		escenario.agregarObjeto(balaCanion);
		
		// ACT: el escenario simula 1 unidad de tiempo
		balaAmet.seMovera(new DireccionDerecha());
		balaCanion.seMovera(new DireccionDerecha());
		escenario.vivir();
		
		// ASSERT
		assertEquals(16.0, balaAmet.getPosicion().getCoordX());
		assertEquals(15.0, balaAmet.getPosicion().getCoordY());
		assertEquals(17.0, balaCanion.getPosicion().getCoordX());
		assertEquals(45.0, balaCanion.getPosicion().getCoordY());
		
	}
	
	public void testProyectilConVelocidadMaximaVaMuchoMasRapidoQueProyectilConVelocidadMinima () {
		
		// ARRANGE		
		Ametralladora amet = new Ametralladora(escenario, new PuntoXY(15, 15));
		LanzaCohetes lanzaCohetes = new LanzaCohetes(escenario, new PuntoXY(15, 45));
		
		Proyectil balaAmet = amet.descargar();						// Velocidad minima (1)
		Proyectil balaLanzaCohetes = lanzaCohetes.descargar();		// Velocidad maxima (3)

		escenario.agregarObjeto(balaAmet);
		escenario.agregarObjeto(balaLanzaCohetes);
		
		// ACT: el escenario simula 1 unidad de tiempo
		balaAmet.seMovera(new DireccionDerecha());
		balaLanzaCohetes.seMovera(new DireccionDerecha());
		escenario.vivir();

		
		// ASSERT
		assertEquals(16.0, balaAmet.getPosicion().getCoordX());
		assertEquals(15.0, balaAmet.getPosicion().getCoordY());
		assertEquals(18.0, balaLanzaCohetes.getPosicion().getCoordX());
		assertEquals(45.0, balaLanzaCohetes.getPosicion().getCoordY());
	}
	
	public void testProyectilConVelocidadMaximaVaMasRapidoQueProyectilConVelocidadMedia () {
		
		// ARRANGE		
		Canion canion = new Canion(escenario, new PuntoXY(15.0, 15.0));
		LanzaCohetes lanzaCohetes = new LanzaCohetes(escenario, new PuntoXY(15.0, 45.0));
		
		Proyectil balaCanion = canion.descargar();					// Velocidad media (2)
		Proyectil balaLanzaCohetes = lanzaCohetes.descargar();		// Velocidad maxima (3)

		escenario.agregarObjeto(balaCanion);
		escenario.agregarObjeto(balaLanzaCohetes);
		
		// ACT: el escenario simula 1 unidad de tiempo
		balaCanion.seMovera(new DireccionDerecha());
		balaLanzaCohetes.seMovera(new DireccionDerecha());
		escenario.vivir();

		
		// ASSERT
		assertEquals(17.0, balaCanion.getPosicion().getCoordX());
		assertEquals(15.0, balaCanion.getPosicion().getCoordY());
		assertEquals(18.0, balaLanzaCohetes.getPosicion().getCoordX());
		assertEquals(45.0, balaLanzaCohetes.getPosicion().getCoordY());	
	
	}

}
